#ifndef STATE_MACHINE_H_
#define STATE_MACHINE_H_
 
#include <stdlib.h>
 
/* 状态枚举 */
typedef enum {
    STATE_1,
    STATE_2,
    STATE_3,
    /* 添加其他状态 */
    STATE_MAX
} State;
 
/* 事件枚举 */
typedef enum {
    EVENT_1,
    EVENT_2,
    EVENT_3,
    /* 添加其他事件 */
    EVENT_MAX
} Event;
 
/* 状态处理函数签名，有两个参数：上下文指针和事件 */
typedef void (*StateHandler)(void *context, Event event);
 
/* 动作函数签名，有两个参数：上下文指针和事件 */
typedef void (*Action)(void *context, Event event);
 
/* 条件判断函数签名，有两个参数：上下文指针和事件，返回值为 int 类型 */
typedef int (*Condition)(void *context, Event event);
 
/* 状态转换规则结构体, 用于定义状态之间的转换规则 */
typedef struct {
    State currentState;      /* 当前状态 */
    Event event;             /* 表示触发状态转换的事件 */
    Condition condition;     /* 条件函数，用于判断是否满足执行该转换规则的条件 */
    Action action;           /* 动作函数，用于执行状态转换时需要执行的动作 */
    State nextState;         /* 转移到的下一个状态 */
    StateHandler handler;    /* 状态处理函数，用于处理进入新状态后的操作 */
} TransitionRule;
 
/* 状态机结构体, 用于表示状态机本身，并存储状态机的状态和上下文数据 */
typedef struct {
    State currentState;         /* 当前状态 */
    TransitionRule *rules;      /* 状态转换规则数组的指针,用于存储所有的状态转换规则 */
    size_t ruleCount;           /* 状态转换规则的数量 */
    void *context;              /* 指向状态机的上下文数据的指针 */
    StateHandler handlers[STATE_MAX];    /* 状态处理函数表,用于存储每个状态对应的处理函数 */
} StateMachine;
 
/* 初始化状态机, 用于初始化状态机。它接受转换规则数组、规则数量、上下文数据指针和状态处理函数数组作为参数，并将它们存储在 StateMachine 结构体中 */
void state_machine_init(StateMachine *machine, TransitionRule *rules, size_t ruleCount, void *context, StateHandler *handlers);
 
/* 执行状态机处理,用于处理事件。它接受一个事件作为参数，并根据当前状态以及转换规则判断是否需要执行状态转换和相关的动作 */
void state_machine_handle_event(StateMachine *machine, Event event);
 
/* 获取当前状态 */
State state_machine_get_current_state(StateMachine *machine);
 
#endif
 

 /*

 */